Zip for UWP
zip ファイルから画像を取得する
タスク別ヘルプ > zip ファイルから画像を取得する

この例では、2個のボタンと1個のリストボックスを使用して、.zip ファイルから画像を取得する方法を示します。

zip ファイルから画像を直接取得するために、最初に、いくつかの画像ファイルを1つの zip ファイルに圧縮するコードを追加します。この例では、btnNew_Click イベントにこのコードを追加します。ここで、ボタンがクリックされたときに画像の新しい .zip ファイルを作成します。

C# コードの書き方

C#
コードのコピー
private void btnNew_Click(object sender, RoutedEventArgs e)
{
// ファイルを開くダイアログを表示します。
SaveFileDialog dlgSaveFile = new SaveFileDialog();
dlgSaveFile.Filter = "Zip Files (*.zip) | *.zip";
// zip ファイルを開きます。
try
{
if (dlgSaveFile.ShowDialog() == true)
{
zipFile.Create(dlgSaveFile.OpenFile());
}
}
catch
{
MessageBox.Show("ZIP ファイルを作成できませんでした。もう一度作成してください。", "C1Zip", MessageBoxButton.OK);
}
}

次に、次のコードを使用して ListBox 内のリストに画像ファイルを追加します。

C# コードの書き方

C#
コードのコピー
private void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            // 追加するファイルのリストを取得します。
            OpenFileDialog fo = new OpenFileDialog();
            fo.Multiselect = true;
            if (fo.ShowDialog() == true)
            {
                // リストにファイルを追加します。
                foreach (FileInfo file in fo.Files)
                {
                    Stream stream = file.OpenRead();
                    listBox1.Items.Add(file.Name);
                    zipFile.Entries.Add(stream, file.Name);
                }            

画像を選択できるようにするには、画像データを含むストリームを取得し(OpenReader メソッド)、次のコードを listBox1_SelectionChanged イベントと StreamCopy イベントに追加します。

C# コードの書き方

C#
コードのコピー
private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            // 選択された項目を取得します。
            string item = (string)listBox1.SelectedItem;
            // 画像を圧縮ストリームから直接ロードします。
            Stream stream = zipFile.Entries[item].OpenReader();
            using (MemoryStream ms = new MemoryStream())
            {
                StreamCopy(ms, stream);
                BitmapImage img = new BitmapImage();
                img.SetSource(ms);
                this.image1.Source = img;
                // ストリームを閉じます。
                stream.Close();
            }
        }
        private void StreamCopy(Stream dstStream, Stream srcStream)
        {
            byte[] buffer = new byte[32768];
            for (; ; )
            {
                int read = srcStream.Read(buffer, 0, buffer.Length);
                if (read == 0) break;
                dstStream.Write(buffer, 0, read);
            }
            dstStream.Flush();
        }                        

このトピックの作業結果

ICO、TIFF、BMP、JPG などのいくつかのタイプの画像が表示されます。

関連トピック